{
 "metadata": {
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3-final"
  },
  "orig_nbformat": 2,
  "kernelspec": {
   "name": "python3",
   "display_name": "Python 3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2,
 "cells": [
  {
   "source": [
    "# 7 基本模块"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "## 1.输入年月日，判断这一天是这一年的第几天？"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "**题目内容：**\n",
    "\n",
    "给定年月日，如2019/1/8，打印输出这一天是该年的第几天。\n",
    "\n",
    "---\n",
    "\n",
    "**输入格式:**\n",
    "\n",
    "共一行，为一个字符串，年月日之间以'/'隔开，如2019/1/8。\n",
    "\n",
    "**输出格式：**\n",
    "\n",
    "共一行，为一个正整数。\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例：**\n",
    "\n",
    "`2019/1/8`\n",
    "\n",
    "\n",
    "**输出样例：**\n",
    "\n",
    "`8`"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "366\n"
     ]
    }
   ],
   "source": [
    "import calendar\n",
    "\n",
    "date = input()\n",
    "date = list(map(int, date.split('/')))\n",
    "year = date[0]\n",
    "month = date[1]\n",
    "day = date[2]\n",
    "\n",
    "days = []\n",
    "\n",
    "for i in range(1, month):\n",
    "    days.append(calendar.monthrange(year, i)[1])\n",
    "\n",
    "total = sum(days) + day\n",
    "\n",
    "print(total)"
   ]
  },
  {
   "source": [
    "**解题思想：**\n",
    "\n",
    "以 `2019/12/30` 为例，将其拆分成“年/月/日”，则\n",
    "\n",
    "第几天 = 前 11 个月的天数之和 + 本月的日\n",
    "\n",
    "而某一年的每个月天数可以用 `calendar` 包里的 `monthrange(year, month)` 函数获得，该函数返回一个二元组 `(该月第一天是周几, 该月的天数)`"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "## 2.公式求值"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "**题目内容：**\n",
    "\n",
    "$sin15^{\\circ} + \\frac{e^x - 5x}{\\sqrt{x^2 + 1}} - ln(3x)$\n",
    "\n",
    "接受一个正整数输入x，打印上述公式的输出值。\n",
    "\n",
    "---\n",
    "\n",
    "**输入格式:**\n",
    "\n",
    "共一行，为一个正整数。\n",
    "\n",
    "**输出格式：**\n",
    "\n",
    "共一行，采用round函数保留10位小数。\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例：**\n",
    "\n",
    "`1`\n",
    "\n",
    "**输出样例：**\n",
    "\n",
    "`-2.4532116354`"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "-2.4532116354\n"
     ]
    }
   ],
   "source": [
    "import math\n",
    "\n",
    "x = int(input())\n",
    "\n",
    "# 注意将 15° 转为弧度制\n",
    "result = math.sin(15 * math.pi / 180) + (math.exp(x) - 5 * x) / (math.sqrt(x ** 2 + 1)) - math.log(3 * x)\n",
    "\n",
    "print(round(result, 10))"
   ]
  },
  {
   "source": [],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "## 3.特殊的数"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "**题目内容：**\n",
    "\n",
    "一个特殊的正整数，它加上150后是一个完全平方数，再加上136又是一个完全平方数，求符合条件的最小的一个数。\n",
    "\n",
    "---\n",
    "\n",
    "**输入格式:**\n",
    "\n",
    "无需输入\n",
    "\n",
    "**输出格式：**\n",
    "\n",
    "共一行，为一个整数。"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "**完全平方数：**\n",
    "\n",
    "完全平方指用一个整数乘以自己例如 1\\*1，2\\*2，3\\*3 等，依此类推。若一个数能表示成某个整数的平方的形式，则称这个数为完全平方数。"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "75\n"
     ]
    }
   ],
   "source": [
    "import math\n",
    "\n",
    "n = 0\n",
    "flag1 = True\n",
    "flag2 = True\n",
    "\n",
    "while flag1 or flag2:\n",
    "    n += 1\n",
    "    flag1 = int(math.sqrt(n + 150)) ** 2 != (n + 150)  # 条件1\n",
    "    flag2 = int(math.sqrt(n + 286)) ** 2 != (n + 286)  # 条件2\n",
    "\n",
    "print(n)"
   ]
  },
  {
   "source": [
    "## 4.大大的叉"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "**题目内容：**\n",
    "\n",
    "打印出n阶的“叉”，这个叉图案由字符‘+’和‘X’构成，n越大，这个图案也就越大\n",
    "\n",
    "---\n",
    "\n",
    "**输入格式:**\n",
    "\n",
    "一个正整数n，1<=n<=20\n",
    "\n",
    "**输出格式：**\n",
    "\n",
    "一个n阶叉图案\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例1：**\n",
    "\n",
    "`1`\n",
    "\n",
    "**输出样例1：**\n",
    "\n",
    "`X`\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例2：**\n",
    "\n",
    "`3`\n",
    "\n",
    "**输出样例2：**\n",
    "\n",
    "```shell\n",
    "\n",
    "X+++X\n",
    "\n",
    "+X+X+\n",
    "\n",
    "++X++\n",
    "\n",
    "+X+X+\n",
    "\n",
    "X+++X\n",
    "\n",
    "```\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例3：**\n",
    "\n",
    "`7`\n",
    "\n",
    "**输出样例3：**\n",
    "\n",
    "```shell\n",
    "\n",
    "X+++++++++++X\n",
    "\n",
    "+X+++++++++X+\n",
    "\n",
    "++X+++++++X++\n",
    "\n",
    "+++X+++++X+++\n",
    "\n",
    "++++X+++X++++\n",
    "\n",
    "+++++X+X+++++\n",
    "\n",
    "++++++X++++++\n",
    "\n",
    "+++++X+X+++++\n",
    "\n",
    "++++X+++X++++\n",
    "\n",
    "+++X+++++X+++\n",
    "\n",
    "++X+++++++X++\n",
    "\n",
    "+X+++++++++X+\n",
    "\n",
    "X+++++++++++X\n",
    "\n",
    "```"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "X+++++++++++X\n+X+++++++++X+\n++X+++++++X++\n+++X+++++X+++\n++++X+++X++++\n+++++X+X+++++\n++++++X++++++\n+++++X+X+++++\n++++X+++X++++\n+++X+++++X+++\n++X+++++++X++\n+X+++++++++X+\nX+++++++++++X\n"
     ]
    }
   ],
   "source": [
    "n = int(input())\n",
    "out = [None] * (2 * n - 1)  # 需要打印 2n - 1 行\n",
    "\n",
    "# 其他行呈对称结构\n",
    "for i in range(n - 1):\n",
    "    out[i] = '+' * i + 'X' + '+' * (2 * n - 3 -2 * i) + 'X' + '+' * i \n",
    "    out[-1 - i] = out[i]\n",
    "\n",
    "# 最中间一行\n",
    "out[n - 1] = '+' * (n - 1) + 'X' + '+' * (n - 1)\n",
    "\n",
    "# 逐行打印\n",
    "for i in range(2 * n - 1):\n",
    "    print(out[i])"
   ]
  },
  {
   "source": [
    "## 5.约瑟夫环问题"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "**题目内容：**\n",
    "\n",
    "已知n个人（以编号0，1，2，3...n-1分别表示）围坐在一张圆桌周围。从编号为0的人开始报数1，数到m的那个人出列；他的下一个人又从1开始报数，数到m的那个人又出列；依此规律重复下去，直到圆桌周围的人全部出列。\n",
    "\n",
    "---\n",
    "\n",
    "**输入格式:**\n",
    "\n",
    "两个正整数n, m，其中3<=n<=100, 1<=m<=n\n",
    "\n",
    "**输出格式：**\n",
    "\n",
    "按照顺序出列的人的编号列表\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例1：**\n",
    "\n",
    "```shell\n",
    "\n",
    "5\n",
    "\n",
    "2\n",
    "\n",
    "```\n",
    "\n",
    "**输出样例1：**\n",
    "\n",
    "`[1, 3, 0, 4, 2]`\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例2：**\n",
    "\n",
    "```shell\n",
    "\n",
    "12\n",
    "\n",
    "3\n",
    "\n",
    "```\n",
    "\n",
    "**输出样例2：**\n",
    "\n",
    "`[2, 5, 8, 11, 3, 7, 0, 6, 1, 10, 4, 9]`"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "[2, 5, 8, 11, 3, 7, 0, 6, 1, 10, 4, 9]\n"
     ]
    }
   ],
   "source": [
    "n = int(input())\n",
    "m = int(input())\n",
    "\n",
    "out = []  # 输出编号列表\n",
    "number = [x for x in range(n)]  # n 个人的编号\n",
    "first = (m - 1) % n\n",
    "out.append(number.pop(first))\n",
    "\n",
    "index = first\n",
    "for i in range(1, n):\n",
    "    index = (index + m - 1) % (n - i)   \n",
    "    out.append(number.pop(index))\n",
    "\n",
    "print(out)"
   ]
  },
  {
   "source": [
    "**解题思路：**\n",
    "\n",
    "在纸上模拟每轮的游戏场景，总结一下规律，如果用 `list.pop(index)` 这个函数来表示出列的游戏规则，不难发现 *每一轮开始的索引值都是上一轮出列的索引值*，而超出范围的索引值用求余数 `%` 即可解决。\n",
    "\n",
    "|轮数  |队列 | 出列序号| 索引值|\n",
    "|:---:|:---| :---: | :---:|\n",
    "|1   |`[0, 1, 2, 3, 4]`|1  | 1|\n",
    "|2   |`[0, 2, 3, 4]`   |3  | 2|\n",
    "|3   |`[0, 2, 4]`      |0  | 0|\n",
    "|4   |`[2, 4]`         |4  | 1|\n",
    "|5   |`[2]`            |2  | 0|"
   ],
   "cell_type": "markdown",
   "metadata": {}
  }
 ]
}